//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Diagnostics.Contracts;

//namespace Granite.Time
//{
//    /// <summary>
//    /// A DateTimeOffset object with a textual time zone code for display purposes
//    /// </summary>
//    public struct DateTimeZoneCode
//    {

//        readonly DateTimeOffset m_DateTimeOffset;
//        readonly String m_TimeZoneCode;

//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="dateTime"></param>
//        /// <param name="timeZoneCode"></param>
//        public DateTimeZoneCode(DateTimeOffset dateTime, string timeZoneCode)
//        {
//            m_DateTimeOffset = dateTime;
//            m_TimeZoneCode = timeZoneCode;
//        }


//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="timeZone"></param>
//        /// <param name="isDaylightSavingTime"></param>
//        /// <returns></returns>
//        public static string GetTimeZoneCode(TimeZoneInfo timeZone, bool isDaylightSavingTime)
//        {
//            if (timeZone == null)
//                throw new ArgumentNullException("timeZone", "timeZone is null.");
//            Contract.EndContractBlock();

//            var longName = isDaylightSavingTime ? timeZone.DaylightName : timeZone.StandardName;
//            switch (longName)
//            {
//                //TODO: US Time zones
//                //TODO: Europe Time zone


//                default:
//                    return longName;
//            }
//        }

//        //TODO: Add mathematical operators


//        /// <summary>
//        /// Returns a <see cref="T:System.String" /> that represents the current <see cref="T:System.Object" />.
//        /// </summary>
//        /// <returns>
//        /// A <see cref="T:System.String" /> that represents the current <see cref="T:System.Object" />.
//        /// </returns>
//        /// <filterpriority>2</filterpriority>
//        public override string ToString()
//        {
//            return m_DateTimeOffset + " " + m_TimeZoneCode;
//        }


//        /// <summary>
//        /// Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Object" />.
//        /// </summary>
//        /// <returns>
//        /// true if the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Object" />; otherwise, false.
//        /// </returns>
//        /// <param name="obj">
//        /// The <see cref="T:System.Object" /> to compare with the current <see cref="T:System.Object" />. 
//        /// </param>
//        /// <filterpriority>2</filterpriority>
//        public override bool Equals(object obj)
//        {
//            if (!(obj is DateTimeZoneCode))
//                return false;

//            var t2 = (DateTimeZoneCode)obj;

//            if (m_TimeZoneCode == null && t2.m_TimeZoneCode == null)
//                return true;

//            if (m_TimeZoneCode == null || t2.m_TimeZoneCode == null)
//                return false;

//            return (m_TimeZoneCode == t2.m_TimeZoneCode) && m_DateTimeOffset == t2.m_DateTimeOffset;

//        }

//        /// <summary>
//        /// Serves as a hash function for a particular type. 
//        /// </summary>
//        /// <returns>
//        /// A hash code for the current <see cref="T:System.Object" />.
//        /// </returns>
//        /// <filterpriority>2</filterpriority>
//        public override int GetHashCode()
//        {
//            if (m_TimeZoneCode == null)
//                return 0;

//            return m_DateTimeOffset.GetHashCode() ^ m_TimeZoneCode.GetHashCode();
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        public DateTimeOffset DateTimeOffset
//        {
//            get { return m_DateTimeOffset; }
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="t1"></param>
//        /// <param name="t2"></param>
//        /// <returns></returns>
//        public static bool operator ==(DateTimeZoneCode t1, DateTimeZoneCode t2)
//        {
//            if (t1.m_TimeZoneCode == null && t2.m_TimeZoneCode == null)
//                return true;

//            if (t1.m_TimeZoneCode == null || t2.m_TimeZoneCode == null)
//                return false;

//            return (t1.m_TimeZoneCode == t2.m_TimeZoneCode) && t1.m_DateTimeOffset == t2.m_DateTimeOffset;
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="t1"></param>
//        /// <param name="t2"></param>
//        /// <returns></returns>
//        public static bool operator !=(DateTimeZoneCode t1, DateTimeZoneCode t2)
//        {
//            if (t1.m_TimeZoneCode == null && t2.m_TimeZoneCode == null)
//                return false;

//            if (t1.m_TimeZoneCode == null || t2.m_TimeZoneCode == null)
//                return true;

//            return (t1.m_TimeZoneCode != t2.m_TimeZoneCode) || t1.m_DateTimeOffset != t2.m_DateTimeOffset;
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        public String TimeZoneCode
//        {
//            get { return m_TimeZoneCode; }
//        }

//    }
//}
